<?php echo use_stylesheet('estilo_reporte.css');?>
<?php slot('actions') ?>
  <ul>
    <li><?php echo link_to('Volver','@homepage')?></li>
    <li> Reportes Teoricos </li>
    <li><a href="<?php echo url_for('vulnerabilidad/reportxss') ?>">XSS</a></li>
    <li><a href="<?php echo url_for('vulnerabilidad/reportpharming') ?>">Pharming</a></li>
    <li><a href="<?php echo url_for('vulnerabilidad/reportspoofing') ?>">Spoofing</a></li>
    <li><a href="<?php echo url_for('vulnerabilidad/reportphishing') ?>">Phishing</a></li>
    <li><a href="<?php echo url_for('vulnerabilidad/reportsafeconf') ?>">Configuraciones Seguras</a></li>
  </ul>
<?php end_slot();?>
		        <div class="reporte_titulo">SQL Injection y Blind SQL Injection  </div>
                <div class="reporte_subtitulo">SQL injection</div>
                <div class="reporte_contenido">
                <p>
Las inyecciones SQL son solo un tipo especifico de vulnerabilidad conocida mas generalmente como “Fallos de Inyeccion”, reconocidos por la OWASP y ubicados entre los 10 problemas mas criticos de las aplicaciones web(OWASP Top Ten).</br>
Los fallos de inyeccion se dan cuando los datos ingresados por el usuario son enviados a un interprete como parte del comando o consulta, y de esta forma se pueden aprovechar para ejecutar comandos via shell o realizar consultas SQL, de esta forma vulnerando sistemas que podrian estar tras un firewall. Estos ataques permiten al agresor crear, modificar o y borrar cualquier información arbitraria disponible en la aplicación. En el peor de los escenarios, permiten comprometer totalmente la aplicación y los sistemas subyacentes, incluso sobrepasar entornos con cortafuegos.</br>
Una propuesta de solucion a este tipo de problemas es verificar que los datos que ingresa el usuario no afecten en algun modo no deseado el comportamiento del interprete invocado por la aplicación. También se aconseja no utilizar intepretes, y en caso de ser necesario, utilizar API's consideradas seguras para minimizar los riesgos de este tipo de ataques.</br>
                </p>
                </div>
                <div class="reporte_subtitulo">Blind SQL injection</div>
                <div class="reporte_contenido">
                <p>
Ataque a ciegas de inyección SQL, en inglés, Blind SQL injection es una técnica de ataque que utiiliza inyección SQL cuando una página web por motivos de seguridad no muestra mensajes de error de la base de datos al no haber un resultado correcto mostrándose siempre el mismo contenido (solo habrá respuesta si el resultado es correcto).</br>
Sentencias del tipo "Or 1=1" o "having 1=1" ofrecen respuestas siempre correctas por lo que son usadas como comprobación. El problema para la seguridad de la página está en que esta técnica es utilizada en combinación con diccionarios o fuerza bruta para la búsqueda carácter por carácter de una contraseña, un nombre de usuario, un número de teléfono o cualquier otra información que albergue la base de datos atacada; para ello se utiliza código SQL específico que "va probando" cada carácter consiguiendo resultado positivo cuando hay una coincidencia. De esta manera se puede saber por ejemplo que una contraseña comienza por "F…", luego "Fi…", luego "Fir…" hasta dar con la palabra completa.</br>
Existen programas que automatizan este proceso de "adivinación" letra por letra del resultado de la consulta SQL que un intruso podría enviar.
                </p>
                </div> <!--Contenido Class End Tag-->
                <div class="reporte_subtitulo">Sobre el Trabajo realizado sobre la cursada</div>
                <div class="reporte_contenido">
                <p>
En cuanto a los ataques de inyeccion SQL no hemos podido desarrollar mucho. El principal inconveniente que se nos presente fue que el utilizar las denominadas "magic quouts" para la insercion de los parametros en las consultas de la siguiente manera:
                </p>
                <div class="reporte_codigo">
                    <code lang="php">
                        $res = $db -> query("SELECT * FROM Usuarios where user='$user'");<br />
                    </code>
                </div>
                <p>
Antes de seguir sobre el tema creemos necesario profundizar sobre este concepto y los requisitos para las mismas, así como sus elementos a favor y en contra.
                </p>
                </div> <!--Contenido Class End Tag-->
                <div class="reporte_subtitulo">Magic Quouts</div>
                <div class="reporte_contenido">
                <p>
La idea detras de esta funcionalidad es el escapar todo el contenido de los inputs recibidos por el usuario, agregando un "". Existen tres tipos de directivas:
                </p>
                <ol>
                    <li><b><u>magic_quouts_gpc:</u></b> la cual se encuentra en el archivo de configuracion de php y no puede ser modificada desde una aplicacion sino que debe ser modificada directamente sobre el archivo de configuracion. Esta directiva afecta a todos los datos de entrada ( $_GET , $_POST y $_COOKIE)</li>
                    <li><b><u>magic_quouts_runtime:</b></u> esta es una opcion que puede ser habilitada o deshabilitada desde una aplicacion, y la mayoría de funciones que devuelven datos de una fuente externa, incluyendo bases de datos y archivos de texto, seran escapadas agregando un \</li>
                    <li><b><u>magic_quouts_sybase:</b></u> en caso de habilitarse esta opcion una comilla sencilla(') se escapa con una comilla sencilla en lugar de una barra invertida()</li>
                </ol>
                <p>
                    Ahora, el uso de esta medida de seguridad puede tener sus complicaciones:
                </p>
                <ul>
                    <li>Por lo general no toda la informacion que es recibida por los inputs, no siempre es utilizada para ser almacenada en una base de datos. Lo cual resulta en que el texto que el usuario deseaba contiene informacion no deseada(los en cada caracter escapado).</li>
                    <li>Suele suceder que muchas veces se protegen las operaciones de insercion o de actualizacion de datos con las magic quouts. Pero al momento de la obtener la informacion de la base de datos para ser utilizada y luego almacenada, no se protegen los datos, con lo cual se pueden llegar a fallos de seguridad.</li>
                    <li>Por lo general los DBMS suelen incluir al "" como caracter para escapar caracteres, aunque por lo general en el estandar se utiliza la comilla simple('). Las Magic Quouts no ofrecen ningun tipo de seguridad para los BDMS donde no se considere a "" como caracter para escapar.</li>
                    <li>Un problema serio es asumir que las Magic Quouts esten habilitadas, y desarrollar en base a eso. Esto puede llevar a que en un entorno de desarrollo, el servidor las tenga habilitadas y que en el entorno de Produccion no, resultado en grandes problemas de seguridad y formato.</li>
                    <li>Magic quotes usan una funcionalidad generica que se provee por la funcion addslashes(), la cual no interpreta caracteres UNICODE y esta sujeta a vulnerabilidades de Injeccion sql en codificaciones multi-byte.</li>
                </ul>
                <p>
                    En cuanto a las ventajas:
                </p>
                <ul>
                    <li>Para los usuarios que recien se inician es una manera de realizar codigo relativamente seguro sin la necesidad de ahondar en funciones especificas o la utilizacion de modulos de abrastraccion de BD.</li>
                </ul>
                </div> <!--Contenido Class End Tag-->
                <div class="reporte_subtitulo">Conclusion</div>
                <div class="reporte_contenido">
                <p>
No se recomiendo la utilizacion de este tipo de mecanismos para escapar los caracteres, debido a las cuestiones presentadas anteriormente. Una forma de lograr aumentar la seguridad en las consultas con los datos ingresados por el usuario es utilizar los metodos como mysql_real_scape(), ademas de comprobar el tipo de los datos que obtenemos como entrada de manera de asegurarnos que seran lo que nosotros esperamos (is_numeric(),settype(),etc).
                </p>
                </div> <!--Contenido Class End Tag-->
                <div class="reporte_subtitulo">Versiones Seguras</div>
                <div class="reporte_contenido">
                <p>
Aqui se presentan algunas configuraciones seguras que pueden reemplazar a la siguiente inscruccion que utiliza las magic quouts:
                </p>
                <div class="reporte_codigo">
                    <code lang="php">
                        /* .... */<br />
                        $res = $db -> query("SELECT * FROM Usuarios where user='$user'");<br />
                        /* .... */<br />
                    </code>
                </div>
                <p>
                    Puede ser reemplazado por:
                </p>
                <div class="reporte_codigo">
                    <code lang="php">
                        /* .... */<br />
                        $consulta  = sprintf("SELECT * FROM Usuarios where user='%s'",<br />
                                             mysql__real_escape_string($user));<br />
                        $res = $db -> query( $consulta);<br />
                        /* .... */<br />
                    </code>
                </div>
                <p>
                    O en caso que los datos recibidos sean numeros como
                </p>
                <div class="reporte_codigo">
                    <code lang="php">
                        /* .... */<br />
                        $idUser = $_COOKIE['idUser'];<br />
                        $res = $db -> query("SELECT logueado FROM Usuarios where id='$idUser'");<br />
                        /* .... */<br />
                    </code>
                </div>
                <p>
                    Puede usarse
                </p>
                <div class="reporte_codigo">
                    <code lang="php">
                        /* .... */<br />
                        $idUser = $_COOKIE['idUser'];<br />
                        settype($idUser,'int')<br />
                        $res = $db -> query("SELECT logueado FROM Usuarios where id='$idUser'");<br />
                        /* .... */<br />
                    </code>
                </div>
